import type { FC } from 'react';

interface IProps {}

const KeywordInTs: FC<IProps> = (props) => {
  return <div>KeywordInTs</div>;
};
export default KeywordInTs;

// https://juejin.cn/post/6844904131975446536
// extends
// 1.用于继承
// !!!!!ts中使用extends时，如果A B分别是，type P1 = 'A'
interface Person {
  name: string;
  age: number;
}
interface Player extends Person {
  item: 'ball' | 'swing';
}
// 2、判断是否是能赋值给另一个类型
type IsPersion<T> = T extends Person ? Person : T;
type p1 = IsPersion<{ name: string; age: number }>;
type p2 = Person extends { name: string } ? number : string;
type T1 = 'A';
type T2 = 'A' | 'B';
type p3 = T1 extends T2 ? number : string;

// 如果extends前面的类型能够赋值给extends后面的类型，那么表达式判断为真，否则为假。
// 如果extends前面的类型能够赋值给extends后面的类型，那么表达式判断为真，否则为假。
// 如果extends前面的类型能够赋值给extends后面的类型，那么表达式判断为真，否则为假。

type T3 = { name: string };
type T4 = { name: string; age: number };
type p4 = T3 extends T4 ? number : string;
// keyof 是TS中的索引类型查询操作符。keyof T 会得到由 T 上已知的公共属性名组成的联合类型
type PersonProperty = keyof Person;
const pp: PersonProperty = 'age';

// in 操作符用于遍历目标类型的公开属性名。类似 for .. in 的机制。
type Property = 'name' | 'age' | 'phoneNum';

type PropertyObject = {
  [key in keyof Person]: string;
};
